/*
 * @Author: fuhongliang-TSJ hongliang.fu@4d-bios.com
 * @Date: 2025-09-03 16:13:18
 * @LastEditTime: 2025-09-16 09:12:47
 * @LastEditors: fuhongliang-TSJ hongliang.fu@4d-bios.com
 * @Description: 
 * @FilePath: \lc_-esp32_-s3\main\test\test_sd_card.c
 * 立创实战派ESP32-S3开发板
 * Copyright (c) 2025 by 4D Bios, All Rights Reserved. 
 */
#include "test_sd_card.h"

static const char *TAG = "test_sd_card";

#define EXAMPLE_MAX_CHAR_SIZE    64

extern sdmmc_card_t *card;

// 写文件内容 path是路径 data是内容
static esp_err_t s_example_write_file(const char *path, char *data)
{
    ESP_LOGI(TAG, "Opening file %s", path);
    FILE *f = fopen(path, "w");   // 以只写方式打开路径中文件
    if (f == NULL) {
        ESP_LOGE(TAG, "Failed to open file for writing"); 
        return ESP_FAIL;
    }
    fprintf(f, data); // 写入内容
    fclose(f);  // 关闭文件
    ESP_LOGI(TAG, "File written");

    return ESP_OK;
}

// 读文件内容 path是路径
static esp_err_t s_example_read_file(const char *path)
{
    ESP_LOGI(TAG, "Reading file %s", path);
    FILE *f = fopen(path, "r");  // 以只读方式打开文件
    if (f == NULL) {
        ESP_LOGE(TAG, "Failed to open file for reading");
        return ESP_FAIL;
    }
    char line[EXAMPLE_MAX_CHAR_SIZE];  // 定义一个字符串数组
    fgets(line, sizeof(line), f); // 获取文件中的内容到字符串数组
    fclose(f); // 关闭文件

    // strip newline
    char *pos = strchr(line, '\n'); // 查找字符串中的“\n”并返回其位置
    if (pos) {
        *pos = '\0'; // 把\n替换成\0
    }
    ESP_LOGI(TAG, "Read from file: '%s'", line); // 把数组内容输出到终端

    return ESP_OK;
}

/**
 * @description: 测试SD卡
 * @return {*}
 */
void test_sd_card(void)
{
    esp_err_t ret;

    size_t bytes_total, bytes_free;                     /* SD卡的总空间与剩余空间 */

    ret = sd_init();
    if (ret != ESP_OK) {
        return;
    }

    // 新建一个txt文件 并且给文件中写入几个字符
    const char *file_hello = MOUNT_POINT"/你好hello.txt";
    char data[EXAMPLE_MAX_CHAR_SIZE];
    snprintf(data, EXAMPLE_MAX_CHAR_SIZE, "%s %s!\n", "你好hello先生", card->cid.name);
    ret = s_example_write_file(file_hello, data);
    if (ret != ESP_OK) {
        return;
    }

    // 打开txt文件，并读出文件中的内容
    ret = s_example_read_file(file_hello);
    if (ret != ESP_OK) {
        return;
    }

    #if 0 //如果不初始化console.c中的storage,会出错,因为挂在0：盘上,sd_get_fatfs_usage程序实际使用1：来获取磁盘信息
    sd_get_fatfs_usage(&bytes_total, &bytes_free);
    ESP_LOGI(TAG, "SD Card.  Total:  %d MB,  Free :  %d MB", bytes_total / 1024, bytes_free / 1024);
    #endif

    ret = sd_unmount();
    if (ret != ESP_OK) {
        return;
    }
}